package com.jh.netty.client;

import com.jh.netty.codec.HexStringDecoder;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;
import sun.nio.cs.ext.GBK;

public class ClientInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline(); //得到 Pipeline 链
        // 往 Pipeline 链中添加一个解码器
        ch.pipeline().addLast(new LengthFieldPrepender(4, false));
        // maxFrameLength：最大帧长度。也就是可以接收的数据的最大长度。如果超过，此次数据会被丢弃。
        // lengthFieldOffset：长度域偏移。就是说数据开始的几个字节可能不是表示数据长度，需要后移几个字节才是长度域。
        // lengthFieldLength：长度域字节数。用几个字节来表示数据长度。
        // lengthAdjustment：数据长度修正。因为长度域指定的长度可以使header+body的整个长度，也可以只是body的长度。如果表示header+body的整个长度，那么我们需要修正数据长度。
        // initialBytesToStrip：跳过的字节数。如果你需要接收header+body的所有数据，此值就是0，如果你只想接收body数据，那么需要跳过header所占用的字节数。
//        ch.pipeline().addLast("lengthDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 2,0, 2));
//        ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
//        ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));

        //引导码   设备码  控制器地址码   数据包长度   数据包       校验码
        //2byte    1byte    1byte        2byte    (长度可变)    2byte
        //new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 4, 4, 0, 0)

        pipeline.addLast(new MyChannelInboundHandlerAdapter());
        pipeline.addLast(new MyChannelOutboundHandlerAdapter());

//        pipeline.addLast("decoder", new HexStringDecoder());
//        // 往 Pipeline 链中添加一个编码器
//        pipeline.addLast("encoder", new HexStringDecoder());
//        // 往 Pipeline 链中添加一个自定义的业务处理对象
        pipeline.addLast("handler", new ChatClientHandler());
    }
}
